package view;

import javax.swing.JPanel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;

import javax.swing.SwingConstants;
import javax.swing.JSeparator;
import javax.swing.JProgressBar;
import javax.swing.LayoutStyle.ComponentPlacement;

import cliente.ClienteImp;
import dominio.bean.CodigoPostal;
import dominio.bean.CodigoPostalId;
import dominio.bean.DetalleLiquidacion;
import dominio.bean.EmpresaTransporte;
import dominio.bean.FormularioCompraProductos;
import dominio.bean.Liquidacion;
import dominio.bean.Peso;
import dominio.bean.Tarifa;

import javax.swing.DefaultListModel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JList;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class PaGenerarLiquidacion extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Create the panel.
	 * @param cliente 
	 * @param archivoElegido 
	 */
	public PaGenerarLiquidacion(ClienteImp cliente, File archivoElegido) {
		
		JLabel lblGenerarLiquidacion = new JLabel("Generar Liquidacion");
		lblGenerarLiquidacion.setHorizontalAlignment(SwingConstants.LEFT);
		lblGenerarLiquidacion.setForeground(Color.BLUE);
		lblGenerarLiquidacion.setFont(new Font("Sylfaen", Font.BOLD | Font.ITALIC, 18));
		
		JSeparator separator = new JSeparator();
		
		JProgressBar progressBar = new JProgressBar();
		progressBar.setStringPainted(true);
		
		JLabel lblStatus = new JLabel("");
		
		JTextArea txtArea = new JTextArea();
		txtArea.setEditable(false);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		GroupLayout groupLayout = new GroupLayout(this);
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addContainerGap()
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addComponent(lblGenerarLiquidacion, GroupLayout.PREFERRED_SIZE, 184, GroupLayout.PREFERRED_SIZE)
						.addComponent(separator, GroupLayout.PREFERRED_SIZE, 440, GroupLayout.PREFERRED_SIZE)
						.addComponent(progressBar, GroupLayout.PREFERRED_SIZE, 398, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblStatus)
						.addGroup(groupLayout.createSequentialGroup()
							.addComponent(txtArea, GroupLayout.PREFERRED_SIZE, 172, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 211, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addContainerGap()
					.addComponent(lblGenerarLiquidacion, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
					.addGap(8)
					.addComponent(separator, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(lblStatus)
					.addGap(29)
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addComponent(txtArea, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
						.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 153, GroupLayout.PREFERRED_SIZE))
					.addContainerGap(39, Short.MAX_VALUE))
		);
		final DefaultListModel listModel = new DefaultListModel();
		
		HashSet<CodigoPostalId> codigosPostalesFaltantes = new  HashSet<CodigoPostalId>();
		try {
			// Obtengo el archivo seleccionado			
			Workbook workbook = Workbook.getWorkbook(archivoElegido);
			
			//Comienzo a recorrer el excel por la primer hoja que encuentra
			for	(int nroHoja = 0 ; nroHoja < workbook.getNumberOfSheets() ; nroHoja++)
			{
				Sheet hoja = workbook.getSheet(nroHoja);
				int filas = hoja.getRows();
				int	columnaSectorReparto;
				int	columnaCodigoPostal;
				columnaSectorReparto			= hoja.findLabelCell("Sector Reparto").getColumn();
				columnaCodigoPostal				= hoja.findLabelCell("Codigo Postal").getColumn();
				
				for(int fila = 1 ; fila < filas ; fila ++) {
					String codPostal= hoja.getCell(columnaCodigoPostal, fila).getContents();
					Integer sector=Integer.parseInt(hoja.getCell(columnaSectorReparto, fila).getContents());
					CodigoPostal codigoPostal=cliente.obtenerCodigoPostal(codPostal, sector);
					
					//Si no existe el codigo postal lo agrego para mostrarlo
					if (codigoPostal==null){
						CodigoPostalId codigoPostalId=new CodigoPostalId();
						codigoPostalId.setIdCodigoPostal(codPostal);
						codigoPostalId.setSector(sector);
						
						codigosPostalesFaltantes.add(codigoPostalId);
					}
				}
			}
		} catch (BiffException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
		
		HashSet<FormularioCompraProductos> formularios=cliente.procesarPlanillaBase(archivoElegido);
		if(codigosPostalesFaltantes.size()==0)
		{
			String faltantes = new String();
			faltantes = "No hubo errores en codigos postales";
			listModel.addElement(faltantes);
			
		}else{
			
			String faltantes = new String();
			faltantes = "Codigos Faltantes ";
			listModel.addElement(faltantes);
			for(CodigoPostalId cp : codigosPostalesFaltantes)
			{
				faltantes = "Codigo Postal: " +cp.getIdCodigoPostal() + "Sector: " + String.valueOf(cp.getSector());
				listModel.addElement(faltantes);
			}
		}
		JList list = new JList(listModel);
		scrollPane.setViewportView(list);
		setLayout(groupLayout);
		if(formularios != null )
		{
			progressBar.setValue(25);
			lblStatus.setText("Excel Procesado");
			HashSet<Liquidacion> cabecerasLiquidaciones = new HashSet<Liquidacion>();
			Integer nroLiquidacion=0;
			for(FormularioCompraProductos form : formularios)
			{
				Liquidacion liquidacion = null;
				
				if(!estaEmpresaEnLiquidacion(form.getEmpresaTransporte(), cabecerasLiquidaciones)){
					liquidacion = new  Liquidacion();
					liquidacion.setEmpresaTransporte(form.getEmpresaTransporte());					
					cabecerasLiquidaciones.add(liquidacion);
				}
				else // la empresa ya tiene cabecera de liquidacion
				{
					liquidacion = obtenerLiquidacion(form.getEmpresaTransporte(),cabecerasLiquidaciones);					
				}
				DetalleLiquidacion detalle=new DetalleLiquidacion();
				detalle.setFormularioCompraProductos(form);			    

			    Tarifa tarifa=cliente.obtenerTarifa(form.getEmpresaTransporte().getIdEmpresaTransporte(),
			    form.getCodigoPostal().getIdCodPostal().getIdCodigoPostal(),
			    form.getCodigoPostal().getIdCodPostal().getSector());
			    detalle.setTarifa(tarifa);
			    
			    Peso peso=form.getProducto().getSubclase().getPeso();
			    Float total=peso.getCostoPeso() + tarifa.getPrecio();
			    detalle.setPrecio(total);
			    
			    liquidacion.getDetallesLiquidacion().add(detalle);
			}
			progressBar.setValue(50);
			lblStatus.setText("Cargando liquidaciones");
			String txtAr = new String();
			for(Liquidacion liq : cabecerasLiquidaciones)
			{
				ArrayList<DetalleLiquidacion> detalles = (ArrayList<DetalleLiquidacion>) liq.getDetallesLiquidacion();
				float total = 0 ;
				for(DetalleLiquidacion det : detalles)
					total = total + det.getPrecio();
				liq.setCostoTotal(total);
				nroLiquidacion=cliente.grabarLiquidacion(liq);
				liq.setIdLiquidacion(nroLiquidacion);
				
				for(DetalleLiquidacion det : detalles)
					det.setIdLiquidacion(liq.getIdLiquidacion());
				txtAr = txtAr + "Id de liquidacion creado: " + String.valueOf(liq.getIdLiquidacion()) + "\n";
				txtArea.setText(txtAr);
			}
			progressBar.setValue(100);
			
		}	
		lblStatus.setText("liquidaciones cargadas");
		
	}

	private Liquidacion obtenerLiquidacion(EmpresaTransporte empresaTransporte,
			HashSet<Liquidacion> cabecerasLiquidaciones) {
		for(Liquidacion liq : cabecerasLiquidaciones){
			if(liq.getEmpresaTransporte().equals(empresaTransporte))
			{
				return liq;
			}
		}
		return null;
	}

	private boolean estaEmpresaEnLiquidacion(
			EmpresaTransporte empresaTransporte,
			HashSet<Liquidacion> cabecerasLiquidaciones) {
		if(cabecerasLiquidaciones.isEmpty())
		{
			return false;
		}else{
			for(Liquidacion liq : cabecerasLiquidaciones)
			{
				if(liq.getEmpresaTransporte().equals(empresaTransporte))
				{
					return true;
				}
			}
			return false;
		}

	}
}
